空间查询

最后更新时间:2019年7月5日

空间条件查询,即通过设置空间范围条件(即点、矩形、多边形),根据选择图层、范围条件对图层要素进行查询并显示查询结果。通过结果要素可获取其空间信息与属性信息,可根据应用需求解析结果,并选择适合的方式展现。

空间查询分为单点查询、矩形查询、多边形查询,区别只在于构建查询范围对象的方法不同。在此以离线地图查询为例,展示实现方法,在线地图的查询实现与此唯一的区别即是构造查询对象使用的方法不同。

一、 单点查询 Sample详情

1

准备查询图层数据

在明确要查询的数据类型之后,就需要选择对应的、适合的查询范围对象MGSFeatureQuery的构造函数,从而针对需要准备图层数据。在此以离线数据为例,直接指定某一图层为查询目标图层,在实际应用中可以通过当前加载的地图获取其图层信息,以列表方式让用户交互选择某个图层进行查询。

//获取地图对象
MGSMap *map=_mapView.map;
//根据图层名称获取其索引值
long layerIndex=[map indexOfName:@"水域"];
//获取矢量图层
MGSVectorLayer *vectorLayer=(MGSVectorLayer *)[map getLayerAtIndex:layerIndex];

2

构造查询范围对象

构造或获取一个坐标点,作为空间范围,构造查询范围对象。

//坐标点,可利用MGSGraphicPoint将其绘制,便于用户查看位置
MGSDot dot=MGSDotMake(12730000, 3560000);
//创建查询范围对象
MGSQueryBound *queryBound=[[MGSQueryBound alloc] initWithPoint:dot];

3

创建查询对象并设置参数

根据图层数据构造查询对象,然后设置其他参数。

//通过矢量图层创建查询对象
MGSFeatureQuery *featureQuery=[[MGSFeatureQuery alloc] initWithVectorLayer:vectorLayer];
//设置查询范围、查询结果每页数量
[featureQuery setQueryBound:queryBound];
[featureQuery setPageSize:20]; //默认为10
//设置空间过滤条件(精确相交)
[featureQuery setSpatialRelationship:SpatialRelOverlap];

说明:(1)建议每页结果数目设置为较小数目,这样能分解查询任务,提高效率。(2)只有空间查询才需要设置空间过滤条件,并且过滤条件有以下三种,由SpatialRelationship提供,根据需要选择。

字段 作用 说明
SpatialRelContain 包含 完全包含在查询范围之内的要素才能被查询到
SpatialRelMbrOverlap 模糊相交 默认方式,与查询范围外包相交、包含的要素能被查询到
SpatialRelOverlap 精确相交 最精确,与查询范围精确相交、包含在内的要素能被查询到

4

查询

执行查询操作,并获取查询结果。

//进行要素查询
MGSFeaturePagedResult *queryResult=[featureQuery query];
//分页获取要素数组
for (int i=1; i <= queryResult.pageCount; i++) {
    //注意getPageWithPageNumber是从1开始的
    NSArray<MGSFeature *> *featureArray=[queryResult getPageWithPageNumber:i];
    //对每一页获取要素
    for (int j=0; j<[featureArray count]; j++) {
        //获取要素
        MGSFeature *feature=featureArray[j];
    }
}

5

结果展示

解析查询返回的结果要素,通过标注、列表等显示展示到界面中。

//将要素转化成图形
NSArray<MGSGraphic *> *graphicArray=[feature toGraphicsWithAttributes:YES];
//绘制图形
[_mapView.graphicsOverlay addGraphics:graphicArray];
[_mapView refresh];

//额外操作:根据需要执行
//获取要素的属性:键值对的形式
NSDictionary<NSString *,NSString *> *attribute = [_modifyFeature attributes];
//获取要素的几何对象:可判断要素几何对象类型,进而得到相关信息:长度、面积等
MGSGeometry *geometry=[feature geometry];
//获取要素的几何信息:可获取颜色、填充符号、点大小等等
MGSGeomInfo *geomInfo=[feature info];

展示效果如下图所示:

点查询.jpg 点查询.jpg


二、 矩形查询 Sample详情

与单点查询不同的就是查询范围对象的设置,根据矩形范围来给定范围。

//构造矩形范围对象
MGSRect queryRect=MGSRectMake(12730000,3550000,12760000,3580000);
//构造查询范围对象,并设置给查询对象
MGSQueryBound *queryBound=[[MGSQueryBound alloc] initWithRect:queryRect];
[featureQuery setQueryBound:queryBound];

展示效果如下图所示:

矩形查询.jpg 矩形查询.jpg


三、 多边形查询 Sample详情

多边形查询则是根据给定的多个点构造查询范围,其它与单点查询相同。

//坐标点集
MGSDot dots[6]={dot1,dot2,dot3,dot4,dot5,dot1}; //首尾点相同
//构造查询范围对象,并设置给查询对象
MGSQueryBound *queryBound=[[MGSQueryBound alloc] initWithPoints:dots count:6];
[featureQuery setQueryBound:queryBound];

展示效果如下图所示:

多边形查询.jpg 多边形查询.jpg